#include <opencv2/core/hal/interface.h>
#include <iostream>
#include <opencv2/core/matx.hpp>
#include <opencv2/core/types.hpp>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/imgproc.hpp>
#include <opencv2/opencv.hpp>
#include "example.h"




int main()
{
    cv::Mat srcImage = cv::imread("../picture/apple.jpeg");
    cv::Mat dstImage;
    cv::Mat dstImage2;
    cv::Mat yuvImage;
    cv::Mat edges_output;
    cv::Mat output;
    char r,g,b;
    int width = srcImage.size().width;
    int height = srcImage.size().height;
    std::vector<cv::Mat> channels;
    cv::bilateralFilter(srcImage, dstImage, 25, 25*2, 25/2);
    
    /*
    cv::split(dstImage, channels);
    cv::Mat b_channel = channels[0];
    cv::Mat g_channel = channels[1];
    cv::Mat r_channel = channels[2];
    cv::imshow("演示输出图像", r_channel);
    cv::waitKey(0);
    cv::imshow("演示输出图像", g_channel);
    cv::waitKey(0);
    cv::imshow("演示输出图像", b_channel);
    cv::waitKey(0);
    cv::imshow("演示输出图像", dstImage);
    cv::waitKey(0);
    cv::imwrite("blue.jpg", b_channel);
    cv::imwrite("green.jpg", g_channel);
    cv::imwrite("red.jpg", r_channel);
    cv::imwrite("bilateralblured.jpg", dstImage);
    */
    cv::medianBlur(dstImage,dstImage2,7);
    dstImage=dstImage2;

    cv::cvtColor(dstImage, yuvImage, cv::COLOR_BGR2YUV); //转为YUV格式，在V通道分辨颜色
    cv::split(yuvImage, channels);
    cv::Mat v_channel = channels[2];
    cv::Mat v_channel_flitered;
    cv::threshold(v_channel,v_channel_flitered,150,255,cv::THRESH_BINARY);

    cv::Mat kernel = cv::getStructuringElement(cv::MORPH_ELLIPSE, cv::Size(35, 35));    //返回指定形状和尺寸的结构元素
    cv::erode(v_channel_flitered, v_channel, kernel);   //腐蚀：减少高亮部分
    cv::dilate(v_channel, v_channel_flitered, kernel);  //膨胀：增加高亮部分
    cv::dilate(v_channel_flitered, v_channel, kernel);  //膨胀：增加高亮部分
    cv::erode(v_channel, v_channel_flitered, kernel);   //腐蚀：减少高亮部分

    cv::Canny(v_channel_flitered, edges_output, 100, 200);
    cv::dilate(edges_output, v_channel, cv::getStructuringElement(cv::MORPH_ELLIPSE, cv::Size(10, 10)));  //膨胀：增加高亮部分
    edges_output = v_channel;
    cv::imshow("边缘图", edges_output);
    cv::waitKey(0);
    int temp;
    output = srcImage;
    for (int i = 0; i < height; i++) {
        for (int j = 0; j < width; j++) {
            temp = edges_output.at<uchar>(i, j);
            if ( temp > 200)
            {
                for(int k=0;k<2;k++)
                {
                    output.at<cv::Vec3b>(i, j)[k] = 255;
                }
            }
        }
    }
    cv::imshow("结果图", output);
    cv::waitKey(0);
    cv::imwrite("output.jpg", output);

}
